{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用 GAN 生成一个类似二次曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# torch.manual_seed(1)       # reproducible\n",
    "# np.random.seed(1)\n",
    "\n",
    "# Hyper Parameters\n",
    "BATCH_SIZE = 64\n",
    "LR_G = 0.0001       # learning rate for generator\n",
    "LR_D = 0.0001       # learning rate for discriminator\n",
    "N_IDEAS = 5         # think of this as number of ideas for generating an art work(Generator)\n",
    "ART_COMPONENTS = 15 # it could be total point G can drew in the canvas\n",
    "PAINT_POINTS = np.vstack([np.linspace(-1, 1, ART_COMPONENTS) for _ in range(BATCH_SIZE)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xc83af28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# show our beautiful painting range\n",
    "plt.plot(PAINT_POINTS[0], np.sin(PAINT_POINTS[0] * np.pi), c='#74BCFF', lw=3, label='standard curve')\n",
    "plt.legend(loc='best')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def artist_works():    # painting from the famous artist (real target)\n",
    "    #a = np.random.uniform(1, 2, size=BATCH_SIZE)[:, np.newaxis]\n",
    "    r = 0.02 * np.random.randn(1, ART_COMPONENTS)\n",
    "    paintings = np.sin(PAINT_POINTS * np.pi) + r\n",
    "    paintings = torch.from_numpy(paintings).float()\n",
    "    return paintings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xabd0f98>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "r = 0.02 * np.random.randn(1, ART_COMPONENTS)\n",
    "paintings = np.sin(PAINT_POINTS * np.pi) + r\n",
    "plt.plot(PAINT_POINTS[0],paintings[0])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "G = nn.Sequential(                  # Generator\n",
    "    nn.Linear(N_IDEAS, 128),        # random ideas (could from normal distribution)\n",
    "    nn.ReLU(),\n",
    "    nn.Linear(128, ART_COMPONENTS), # making a painting from these random ideas\n",
    ")\n",
    "\n",
    "D = nn.Sequential(                  # Discriminator\n",
    "    nn.Linear(ART_COMPONENTS, 128), # receive art work either from the famous artist or a newbie like G\n",
    "    nn.ReLU(),\n",
    "    nn.Linear(128, 1),\n",
    "    nn.Sigmoid(),                   # tell the probability that the art work is made by artist\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nefdyqsXzLMv8hDtbnn2/rjmpjUtJVwJHpJTxUkoLsBg414wdU4EGcce3uLiY119/nQkTJlRY/+KL\nL7J69WqWL1/ufLMOCQnh0CFtjAC73U7Xrl3ZunWrs42UEn9/f06dOkV6enqFs5CyfXz++edce+21\nxMXFMXjwYKSUFfZTdo36hhtuYMmSJSQnJzvPBq6//nrnJZGyr7S0NAYOHOi8Vl12ucZV2Rt7enq6\n8zJXWRubzcauXbucb5xlzGZtmEpvb2+KiorIz8/n999/p3v37hXqud4U3rx5Mx07Vv0oo91uJzc3\nl9zc3ApnHmWvTVUWLVrkfCN3ja9sHx07dmTHDm2u3+3bt58Vw5m/t6rqV5bUY2JieOaZZ5yX87p2\n7cqjjz5KXFwcW7dudV4OLPsZ2rZty19/aZ+H9uzZA0BwcDA9e/Zk3bp1xMXFsXv3boQQxMfHn/W6\n14cDGXDI8ZFMABM6gxCwLmclG3PXOOvNCnualubweo+vPpkMML788xItCq/FvbQzKzOXkGXN0C+w\nBqA2Pg5EAC5PQJMI9K+sohDCCxgN3OeyWgJrhRA24D0p5YJaiOmcFi1axJYtW7DZbMTGxtK7d+8K\n28eNG8eQIUO48sornZ+mX3jhBe6++26EEFx33XU88MADtG3blsGDB+Pu7s7XX39NbGws48ePZ9Cg\nQYSEhJx13OHDh3Pbbbfx7bffOtdNmDCB7777jiFDhuDj48OqVavw8/PDw8PD+SkTqj5jCAkJwcPD\ng+joaHr37s2VV14JwKxZs3jrrbd45JFH2Lt3L3a7nXnztCt8M2bM4Oabb+att94iNjYWN7eKc/T2\n79+fP//8k549e/Lkk08yatQoPDw8+PjjjwGYN28e06ZNY/fu3Tz99NO4u7sTHR1N//6V/toB+Oc/\n/+m8F/Lss89WWQ8gLS2NYcOGYTAY6Nq1K//3f/9XYXuPHj14/PHHmTx5MkuWLOGjjz4iOjoaX19f\nPv/88wp1K/u9nVn/zEtpZSZNmkSvXr2cb/axsbHcfffd/Pe//0VKedbN+LCwMHr37k10dDTdu3fH\nbDZjMBh46KGHGDFiBEIIunfvzjvvvMP69esZN27cOV+H2ma1a53YyvSPgHBfSCo5zrsp5Vd/r25x\nHdF+o+o1Nr10C4IugVqyFBhplfMwx4PuYVnGx8wIfUjv8HQjanpaK4SYBIyWUs5wlKcB/aWU91VS\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xc81b2b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "opt_D = torch.optim.Adam(D.parameters(), lr=LR_D)\n",
    "opt_G = torch.optim.Adam(G.parameters(), lr=LR_G)\n",
    "\n",
    "plt.ion()    # something about continuous plotting\n",
    "\n",
    "D_loss_history = []\n",
    "G_loss_history = []\n",
    "for step in range(10000):\n",
    "    artist_paintings = artist_works()          # real painting from artist\n",
    "    G_ideas = torch.randn(BATCH_SIZE, N_IDEAS) # random ideas\n",
    "    G_paintings = G(G_ideas)                   # fake painting from G (random ideas)\n",
    "    \n",
    "    prob_artist0 = D(artist_paintings)         # D try to increase this prob\n",
    "    prob_artist1 = D(G_paintings)              # D try to reduce this prob\n",
    "    \n",
    "    D_loss = - torch.mean(torch.log(prob_artist0) + torch.log(1. - prob_artist1))\n",
    "    G_loss = torch.mean(torch.log(1. - prob_artist1))\n",
    "    \n",
    "    D_loss_history.append(D_loss)\n",
    "    G_loss_history.append(G_loss)\n",
    "    \n",
    "    opt_D.zero_grad()\n",
    "    D_loss.backward(retain_graph=True)    # reusing computational graph\n",
    "    opt_D.step()\n",
    "    \n",
    "    opt_G.zero_grad()\n",
    "    G_loss.backward()\n",
    "    opt_G.step()\n",
    "    \n",
    "    if step % 50 == 0:  # plotting\n",
    "        plt.cla()\n",
    "        plt.plot(PAINT_POINTS[0], G_paintings.data.numpy()[0], c='#4AD631', lw=3, label='Generated painting',)\n",
    "        plt.plot(PAINT_POINTS[0], np.sin(PAINT_POINTS[0] * np.pi), c='#74BCFF', lw=3, label='standard curve')\n",
    "        plt.text(-1, 0.75, 'D accuracy=%.2f (0.5 for D to converge)' % prob_artist0.data.numpy().mean(), fontdict={'size': 8})\n",
    "        plt.text(-1, 0.5, 'D score= %.2f (-1.38 for G to converge)' % -D_loss.data.numpy(), fontdict={'size': 8})\n",
    "        plt.ylim((-1, 1));plt.legend(loc='lower right', fontsize=10);plt.draw();plt.pause(0.01)\n",
    "\n",
    "plt.ioff()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
